package com.zhx.common.chat.service.adapter;

import cn.hutool.core.bean.BeanUtil;
import com.zhx.common.chat.domain.entity.Contact;
import com.zhx.common.chat.domain.entity.GroupMember;
import com.zhx.common.chat.domain.entity.Room;
import com.zhx.common.chat.domain.entity.RoomGroup;
import com.zhx.common.chat.domain.enums.GroupRoleEnum;
import com.zhx.common.chat.domain.enums.MessageTypeEnum;
import com.zhx.common.chat.domain.vo.request.ChatMessageReq;
import com.zhx.common.chat.domain.vo.response.ChatMessageReadResp;
import com.zhx.common.chat.domain.vo.response.ChatRoomResp;
import com.zhx.common.user.domain.entity.User;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class RoomAdapter {


    public static List<ChatRoomResp> buildResp(List<Room> list) {
        return list.stream()
                .map(a -> {
                    ChatRoomResp resp = new ChatRoomResp();
                    BeanUtil.copyProperties(a, resp);
                    resp.setActiveTime(a.getActiveTime());
                    return resp;
                }).collect(Collectors.toList());
    }

    public static List<ChatMessageReadResp> buildReadResp(List<Contact> list) {
        return list.stream().map(contact -> {
            ChatMessageReadResp resp = new ChatMessageReadResp();
            resp.setUid(contact.getUid());
            return resp;
        }).collect(Collectors.toList());
    }

    /**
     * 根据用户ID列表和群组ID，构建群组成员批次列表。
     *
     * @param uidList 用户ID列表，这些用户将被添加到指定的群组中。
     * @param groupId 指定的群组ID，用于将用户添加到特定群组。
     * @return 返回一个群组成员批次列表，每个群组成员对象包含用户ID、群组ID和成员角色。
     */
    public static List<GroupMember> buildGroupMemberBatch(List<Long> uidList, Long groupId) {
        // 通过流处理uidList，去除重复的用户ID，然后为每个唯一的用户ID创建一个群组成员对象
        return uidList.stream()
                .distinct() // 确保处理的用户ID是唯一的
                .map(uid -> {
                    GroupMember member = new GroupMember();
                    member.setRole(GroupRoleEnum.MEMBER.getType()); // 设置成员角色为普通成员
                    member.setUid(uid); // 设置用户ID
                    member.setGroupId(groupId); // 设置群组ID
                    return member;
                }).collect(Collectors.toList()); // 收集所有创建的群组成员对象到列表中
    }

    /**
     * 构建群组添加消息
     *
     * @param groupRoom 群组房间信息，包含房间ID等
     * @param inviter 邀请者信息，包含邀请者的用户信息
     * @param member 被邀请者信息，以用户ID为键，用户信息为值的映射
     * @return 返回构建好的聊天消息请求对象，包含消息内容和类型等
     */
    public static ChatMessageReq buildGroupAddMessage(RoomGroup groupRoom, User inviter, Map<Long, User> member) {
        ChatMessageReq chatMessageReq = new ChatMessageReq();
        chatMessageReq.setRoomId(groupRoom.getRoomId()); // 设置房间ID
        chatMessageReq.setMsgType(MessageTypeEnum.SYSTEM.getType()); // 设置消息类型为系统消息

        // 构建消息体，格式为"邀请者姓名"邀请"被邀请者1,被邀请者2"加入群聊
        StringBuilder sb = new StringBuilder();
        sb.append("\"")
                .append(inviter.getName())
                .append("\"")
                .append("邀请")
                .append(member.values().stream().map(u -> "\"" + u.getName() + "\"").collect(Collectors.joining(",")))
                .append("加入群聊");
        chatMessageReq.setBody(sb.toString()); // 设置消息内容

        return chatMessageReq;
    }
}